// 该案例中子进程和父进程同时对一个文件进行写操作导致文件发生混乱的实例
// 写入数据的文件由argv[2] 指定，数据来源在argv[1]所指定的文件中
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>

// 创建读和写文件描述符
int readfd, writefd;

// 文件内容的中转字符空间
char c;

int main(int argc, char *argv[]){
	
	// 创建进程描述符变量
	pid_t pid;

	int i=0;

	if(argc != 3){
		printf("Usage %s sourcesfile1 destfile. \n", argv[0]);
		return -2;
	}

	// 以只读方式打开文件argv[1]
	if( (readfd = open(argv[1], O_RDONLY)) == -1 ){
		printf("文件%s打开失败!\n", argv[1]);
		return -3;
	}

	// 以写方式打开文件argv[2]
	if( (writefd = open(argv[2], O_RDWR|O_CREAT|O_TRUNC, S_IRWXU)) == -1){
	//if( (writefd = creat(argv[2], S_IRWXU) == -1) ){
		printf("文件%s打开失败!\n", argv[2]);
		return -4;
	}

	// 创建子进程
	pid = fork();

	if(pid == -1){
		printf("创建子进程失败!\n");
		return -5;
	}else if(pid == 0){
		// 令子进程睡眠1s,从而避免子进程和父进程同时执行
		sleep(1);
	}

	// 此时子进程和父进程同时执行,将readfd中的数据写入到writefd中
	for( ; ; ){
		if( read(readfd, &c,1) != 1){
			//printf("文件读取失败!\n");
			// 读取到最后一个字符后退出
			return -6;
		}
		//printf("第%d次写入!\n", i++);
		write(writefd, &c, 1);
	
	}

	return 0;
}
